home *** CD-ROM | disk | FTP | other *** search
-
- '' gadtoolsgadgets.bas
- ''
- '' Simple example of using a number of gadtools gadgets.
- '' Derived from RKM example (c) Copyright 1992 Commodore-Amiga, Inc.
- '' Extended to show a ListView gadgets
- ''
-
- DEFINT a-z
-
- 'REM $include intuition.bh
- 'REM $include gadtools.bh
- 'REM $include graphics.bh
- 'REM $include exec.bh
- REM $include Blib/ExecSupport.bas
-
- LIBRARY OPEN "intuition.library",37
- LIBRARY OPEN "gadtools.library",37
- LIBRARY OPEN "graphics.library",37
- LIBRARY OPEN "exec.library"
-
- ' we are going to do our own event handling
- REM $NOEVENT
- ' Gadget defines of our choosing, to be used as GadgetID's,
- ' also used as the index into the gadget array my_gads().
- '
- CONST MYGAD_SLIDER=0
- CONST MYGAD_STRING1=1
- CONST MYGAD_STRING2=2
- CONST MYGAD_STRING3=3
- CONST MYGAD_BUTTON=4
- CONST MYGAD_LISTVIEW=5
-
- ' Range for the slider:
- CONST SLIDER_MIN=1
- CONST SLIDER_MAX=20
-
-
- SUB InitTextAttr(T(1),FontName$,BYVAL Height,BYVAL style,BYVAL flags)
- POKEL VARPTR(T(0))+ta_Name%,SADD(FontName$+CHR$(0))
- t(ta_YSize\2)=Height
- POKEB VARPTR(T(0))+ta_Style,style
- POKEB VARPTR(T(0))+ta_Flags,flags
- END SUB
-
- DIM SHARED temptag&(40)
- DIM SHARED Topaz80(4)
- DIM SHARED junk&
- InitTextAttr Topaz80(),"topaz.font",8,0,0
- gadtoolswindow
-
- ' Subprogram to handle a GADGETUP or GADGETDOWN event. For GadTools gadgets,
- ' it is possible to use this function to handle MOUSEMOVEs as well, with
- ' little or no work.
- '
- SUB HandleGadgetEvent(BYVAL win&, BYVAL gad&, BYVAL code, slider_level, my_gads&(1))
- STATIC gid
- gid=PEEKW(gad&+gadgetgadgetid)
- SELECT CASE Gid
- CASE MYGAD_SLIDER:
- ' Sliders report their level in the IntuiMessage Code field:
- PRINT "Slider at level ", code
- slider_level = code
- CASE MYGAD_STRING1:
- PRINT "String gadget 1: '"; PEEK$(PEEKL(PEEKL(gad&+GadgetSpecialInfo)+StringInfoBuffer));"'"
- CASE MYGAD_STRING2:
- PRINT "String gadget 2: '"; PEEK$(PEEKL(PEEKL(gad&+GadgetSpecialInfo)+StringInfoBuffer));"'"
- CASE MYGAD_STRING3:
- PRINT "String gadget 3: '"; PEEK$(PEEKL(PEEKL(gad&+GadgetSpecialInfo)+StringInfoBuffer));"'"
- CASE MYGAD_BUTTON:
- PRINT "Button was pressed, slider reset to 10."
- slider_level = 10
- TAGLIST VARPTR(temptag&(0)),GTSL_Level&,slider_level,TAG_END&
- GT_SetGadgetAttrsA my_gads&(MYGAD_SLIDER), win&, 0,VARPTR(temptag&(0))
- CASE MYGAD_LISTVIEW:
- PRINT "List line";code; "selected"
- END SELECT
- END SUB
-
-
- ' Subprogram to handle vanilla keys.
- SUB HandleVanillaKey(BYVAL win&, BYVAL code, slider_level,my_gads&(1))
- SELECT CASE code
- CASE "v"%
- ' increase slider level, but not past maximum
- INCR slider_level
- IF slider_level> SLIDER_MAX THEN slider_level=SLIDER_MAX
- TAGLIST VARPTR(temptag&(0)),GTSL_Level&,slider_level,TAG_END&
- GT_SetGadgetAttrsA my_gads&(MYGAD_SLIDER), win&, 0,VARPTR(temptag&(0))
- CASE "V"%
- DECR slider_level
- IF slider_level< SLIDER_MIN THEN slider_level=SLIDER_MIN
- TAGLIST VARPTR(temptag&(0)),GTSL_Level&,slider_level,TAG_END&
- GT_SetGadgetAttrsA my_gads&(MYGAD_SLIDER), win&, 0,VARPTR(temptag&(0))
- CASE "c"%,"C"%:
- slider_level = 10
- TAGLIST VARPTR(temptag&(0)),GTSL_Level&,slider_level,TAG_END&
- GT_SetGadgetAttrsA my_gads&(MYGAD_SLIDER), win&, 0,VARPTR(temptag&(0))
- CASE "f"%,"F"%: junk&=ActivateGadget&( my_gads&(MYGAD_STRING1), win&, 0)
- CASE "s"%,"S"%: junk&=ActivateGadget&( my_gads&(MYGAD_STRING2), win&, 0)
- CASE "t"%,"T"%: junk&=ActivateGadget&( my_gads&(MYGAD_STRING3), win&, 0)
- END SELECT
- END SUB
-
- SUB Setng_GadgetText(a$)
- SHARED ng(1)
- POKEL VARPTR(ng(ng_GadgetText\2)),SADD(a$+CHR$(0))
- END SUB
-
- SUB Setng_ArrayName(BYVAL fieldoffset,arr(1))
- SHARED ng(1)
- POKEL VARPTR(ng(fieldoffset\2)),VARPTR(arr(0))
- END SUB
-
- ' Add a name value$ to an ExecList listh&
- ' this should really copy value$=CHR$(0) to some AllocMem&ed memory
- ' as this won't work once a garbage collection has happened.
- SUB AddName(listh&,value$)
- STATIC namenode&
- namenode&=AllocMem&(node_sizeof,MEMF_CLEAR&)
- IF namenode&=0 THEN ERROR 7 ' out of memory
- POKEL namenode&+ln_Name, SADD(value$+CHR$(0))
- AddHead listh&,namenode&
- END SUB
-
- ' Create the whole listview gadget
- FUNCTION CreateListGadget&
- STATIC i,Listhead&
- listhead&=AllocMem&(list_sizeof,MEMF_CLEAR&)
- NewList listhead&
- FOR i=15 TO 0 STEP -1
- AddName listhead&,"line"+STR$(i)
- NEXT i
- CreateListGadget&=listhead&
- END FUNCTION
-
- ' Free the listview gadget and all its nodes
- SUB FreeListGadget(BYVAL listhead&)
- STATIC worknode&,nextnode&
- worknode&=PEEKL(ListHead&+lh_head)
- DO
- nextnode&=PEEKL(worknode&+ln_Succ)
- IF nextnode&=0 THEN EXIT LOOP
- FreeMem worknode&,node_sizeof
- worknode&=nextnode&
- LOOP
- END SUB
-
-
- FUNCTION CreateAllGadgets&(glistptr&, BYVAL vi&, BYVAL thetopborder, slider_level, my_gads&(1))
- SHARED ng(1),listviewlist&
- STATIC gad&
- STATIC gadgettags&(1)
- gad& = CreateContext&(VARPTR(glistptr&))
-
- ' Since the NewGadget structure is unmodified by any of the CreateGadgetA()
- ' calls, we need only change those fields which are different.
- '
- DIM ng(NewGadget_sizeof\2)
- DIM GadgetTags&(20)
-
- ng(ng_LeftEdge\2) = 140
- ng(ng_TopEdge\2) = 20+thetopborder
- ng(ng_Width\2) = 200
- ng(ng_Height\2) = 12
- Setng_GadgetText "_Volume: "
- Setng_ArrayName ng_TextAttr,topaz80()
- POKEL VARPTR(ng(ng_visualInfo\2)),vi&
- ng(ng_GadgetID\2) = MYGAD_SLIDER
- ng(ng_Flags\2) = NG_HIGHLABEL&
-
- TAGLIST VARPTR(GadgetTags&(0)), _
- GTSL_Min&, SLIDER_MIN, _
- GTSL_Max&, SLIDER_MAX, _
- GTSL_Level&, slider_level, _
- GTSL_LevelFormat&, "%2ld", _
- GTSL_MaxLevelLen&, 2, _
- GT_Underscore&, "_"%, _
- TAG_END&
- gad& = CreateGadgetA&(SLIDER_KIND&, gad&, VARPTR(ng(0)), VARPTR(gadgetTags&(0)))
- my_gads&(MYGAD_SLIDER) = gad&
-
- ng(ng_TopEdge\2) = ng(ng_TopEdge\2) +20
- ng(ng_Height\2) = 14
- Setng_GadgetText "_First:"
- ng(ng_GadgetID\2) = MYGAD_STRING1
- TAGLIST VARPTR(GadgetTags&(0)), _
- GTST_String&, "Try pressing", _
- GTST_MaxChars&, 50, _
- GT_Underscore&, "_"%, _
- TAG_END&
- gad& = CreateGadgetA&(STRING_KIND&, gad&, VARPTR(ng(0)), VARPTR(gadgetTags&(0)))
- my_gads&(MYGAD_STRING1) = gad&
-
- ng(ng_TopEdge\2) = ng(ng_TopEdge\2) +20
- Setng_GadgetText "_Second:"
- ng(ng_GadgetID\2) = MYGAD_STRING2
- TAGLIST VARPTR(GadgetTags&(0)), _
- GTST_String&, "TAB or Shift-TAB", _
- GTST_MaxChars&, 50, _
- GT_Underscore&, "_"% , _
- TAG_END&
- gad& = CreateGadgetA&(STRING_KIND&, gad&, VARPTR(ng(0)), VARPTR(gadgetTags&(0)))
- my_gads&(MYGAD_STRING2) = gad&
-
- ng(ng_TopEdge\2) = ng(ng_TopEdge\2) +20
- Setng_GadgetText "_Third:"
- ng(ng_GadgetID\2) = MYGAD_STRING3
- TAGLIST VARPTR(GadgetTags&(0)), _
- GTST_String&, "To see what happens!", _
- GTST_MaxChars&, 50, _
- GT_Underscore&, "_"% , _
- TAG_END&
- gad& = CreateGadgetA&(STRING_KIND&, gad&, VARPTR(ng(0)), VARPTR(gadgetTags&(0)))
- my_gads&(MYGAD_STRING3) = gad&
-
- ng(ng_LeftEdge\2)=ng(ng_LeftEdge\2) + 50
- ng(ng_TopEdge\2) = ng(ng_TopEdge\2) +20
- ng(ng_Width\2) = 100
- ng(ng_Height\2) = 12
- Setng_GadgetText "_Click Here"
- ng(ng_GadgetID\2) = MYGAD_BUTTON
- ng(ng_Flags\2) = 0
- TAGLIST VARPTR(GadgetTags&(0)), GT_Underscore&, "_"%, TAG_END&
- gad& = CreateGadgetA&(BUTTON_KIND&, gad&, VARPTR(ng(0)), VARPTR(gadgetTags&(0)))
-
- ng(ng_LeftEdge\2) = 400
- ng(ng_TopEdge\2) = 20+thetopborder
- ng(ng_Width\2) = 150
- ng(ng_Height\2) = 50
- Setng_GadgetText "A list of lines"
- ng(ng_GadgetID\2) = MYGAD_LISTVIEW
- ng(ng_Flags\2) = 0
-
- listviewlist&=CreateListGadget&
- TAGLIST VARPTR(GadgetTags&(0)), GT_Underscore&, "_"%, GTLV_Labels&, listviewlist&, TAG_END&
- gad& = CreateGadgetA&(LISTVIEW_KIND&, gad&, VARPTR(ng(0)), VARPTR(gadgetTags&(0)))
-
- CreateAllGadgets&=gad&
- END FUNCTION
-
- ' Standard message handling loop with GadTools message handling functions
- ' used (GT_GetIMsg&() and GT_ReplyIMsg).
- SUB Process_window_events(BYVAL mywin&, slider_level, my_gads&())
- STATIC imsg&
- STATIC imsgClass&
- STATIC imsgCode
- STATIC gad&
- STATIC terminated
- terminated=0
-
- WHILE terminated=0
- junk&= xWait&(1& << PEEKB(PEEKL(mywin&+UserPort)+mp_SigBit))
-
- DO
- imsg& = GT_GetIMsg(PEEKL(mywin&+UserPort))
- IF imsg&=0 THEN EXIT LOOP
- gad& = PEEKL(imsg&+IAddress)
-
- imsgClass& =PEEKL(imsg&+Class)
- imsgCode =PEEKW(imsg&+IntuiMessageCode)
-
- GT_ReplyIMsg imsg&
- SELECT CASE imsgClass&
- CASE IDCMP_GADGETDOWN&, IDCMP_MOUSEMOVE&, IDCMP_GADGETUP&:
- HandleGadgetEvent mywin&, gad&, imsgCode, slider_level, my_gads&()
- CASE IDCMP_VANILLAKEY&:
- HandleVanillaKey mywin&, imsgCode, slider_level, my_gads&()
- CASE IDCMP_CLOSEWINDOW&:
- terminated = 1
- CASE IDCMP_REFRESHWINDOW&:
- GT_BeginRefresh mywin&
- GT_EndRefresh mywin&, TRUE&
- END SELECT
- LOOP UNTIL terminated
- WEND
- END SUB
-
- ' Prepare for using GadTools, set up gadgets and open window.
- ' Clean up and when done or on error.
-
- SUB GadtoolsWindow
- STATIC glist&
- STATIC font&
- STATIC mysc&
- STATIC mywin&
- DIM my_gads&(4)
- STATIC vi&
- STATIC slider_level
- STATIC thetopborder
- SHARED listviewlist&
- slider_level=5
- ' Open topaz 8 font, so we can be sure it's openable
- ' when we later set ng_TextAttr to &Topaz80:
- '
- font& = OpenFont(VARPTR(Topaz80(0)))
- IF font& = 0 THEN
- PRINT "Failed to open Topaz 80": STOP
- ELSE
- mysc& = LockPubScreen(0)
- IF mysc&=0 THEN
- PRINT "Couldn't lock public screen"
- ELSE
- TAGLIST VARPTR(temptag&(0)), TAG_END&
- vi& = GetVisualInfoA&(mysc&, VARPTR(temptag&(0)))
- IF vi& = 0 THEN
- PRINT "GetVisualInfo failed"
- ELSE
- ' Here is how we can figure out ahead of time how tall the
- ' window's title bar will be:
- thetopborder = PEEKB(mysc&+WBorTop) + PEEKW(PEEKL(mysc&+ScreenFont)+ta_YSize) + 1
- IF CreateAllGadgets&(glist&,vi&,thetopborder,slider_level,my_gads&())=0 THEN
- PRINT "CreateAllGadgets failed"
- ELSE
- TAGLIST VARPTR(temptag&(0)), _
- WA_Title&, "GadTools Gadget Demo", _
- WA_Gadgets&, glist&, WA_AutoAdjust&, TRUE&, _
- WA_Width&, 600&, WA_MinWidth&, 50&, _
- WA_InnerHeight&, 140&, WA_MinHeight&, 50&, _
- WA_DragBar&, TRUE&, WA_DepthGadget&, TRUE&, _
- WA_Activate&, TRUE&, WA_CloseGadget&, TRUE&, _
- WA_SizeGadget&, TRUE&, WA_SimpleRefresh&, TRUE&, _
- WA_IDCMP&, IDCMP_CLOSEWINDOW&+IDCMP_REFRESHWINDOW&+ _
- IDCMP_VANILLAKEY&+ SLIDERIDCMP&+ STRINGIDCMP&+ BUTTONIDCMP&, _
- WA_PubScreen&, mysc&, _
- TAG_END&
- mywin& = OpenWindowTagList&(0,VARPTR(temptag&(0)))
- IF mywin&=0 THEN
- PRINT "OpenWindow failed"
- ELSE
- GT_RefreshWindow mywin&, 0
- process_window_events mywin&, slider_level, my_gads&()
-
- CloseWindow mywin&
- END IF
- END IF
- FreeGadgets glist&
- FreeListGadget listviewlist&
- FreeVisualInfo vi&
- END IF
- UnlockPubScreen 0, mysc&
- END IF
- CloseFont font&
- END IF
- END SUB
-
-
-